Read air temperature data
Type | Intent | Optional | Attributes | Name | ||
---|---|---|---|---|---|---|
type(DateTime), | intent(in) | :: | time |
current time |
||
type(grid_real), | intent(in) | :: | dem |
Type | Visibility | Attributes | Name | Initial | |||
---|---|---|---|---|---|---|---|
character(len=300), | public | :: | filename | ||||
integer(kind=short), | public | :: | i | ||||
integer(kind=short), | public | :: | j | ||||
real(kind=float), | public | :: | rsquare | ||||
type(DateTime), | public | :: | time_toread |
time to start reading from |
|||
character(len=300), | public | :: | varname |
SUBROUTINE AirTemperatureDailyMinRead & ! ( time, dem ) IMPLICIT NONE !Arguments with intent(in): TYPE (DateTime), INTENT(IN) :: time !!current time TYPE (grid_real), INTENT(IN) :: dem !digital elevation model to apply drift !local declarations: TYPE (DateTime) :: time_toread !! time to start reading from CHARACTER (LEN = 300) :: filename CHARACTER (LEN = 300) :: varname REAL (KIND = float) :: rsquare INTEGER (KIND = short) :: i, j !-------------------------end of declarations---------------------------------- IF ( .NOT. (time < timeNew) ) THEN !time_toread = time + - (dtTemperatureDailyMin - thermometersDailyMin % timeIncrement) time_toread = time timeString = time_toread CALL Catch ('info', 'AirTemperatureDailyMin', & 'read new temperature data: ', & argument = timeString) !update lapse rate from maps when required IF (elevationDrift == 1) THEN IF (time == lapse_map % next_time) THEN !update lapse_map varname = lapse_map %var_name filename = lapse_map % file_name !destroy current grid CALL GridDestroy (lapse_map) !read new grid in netcdf file CALL NewGrid (layer = lapse_map, fileName = TRIM(filename), & fileFormat = NET_CDF, & variable = TRIM(varname), & time = time_toread) END IF END IF SELECT CASE (interpolationMethod) CASE (0) !input grid CALL ReadField (fileGrid, time_toread, & dtTemperatureDailyMin, dtGrid, & 'N', temperatureAirDailyMin, & varName = temperatureAirDailyMin % var_name) CASE DEFAULT !requires interpolation !read new data CALL ReadData (network = thermometersDailyMin, fileunit = fileunit, & time = time_toread, aggr_time = dtTemperatureDailyMin, & aggr_type = 'min', tresh = valid_prcn) IF (elevationDrift == 1) THEN !update lapse rate from data IF (lapse_rate_computation == 1) THEN DO i = 1, thermometersDailyMin % countObs vectorT (i) = thermometersDailyMin % obs (i) % value vectorZ (i) = thermometersDailyMin % obs (i) % xyz % elevation END DO lapse_computed = LinearRegressionSlope (x=vectorZ, y=vectorT, & nodata = thermometersDailyMin % nodata, r2 = rsquare) IF (rsquare < r2min) THEN lapse_computed = lapse ENDIF lapse_map = lapse_computed END IF !shift observation to reference elevation by applying lapse rate CALL ShiftMeteoWithLapse (thermometersDailyMin, lapse_map, refElevation, & stationsRefElev) !interpolate IF (interpolationMethod_assignment == 1) THEN !only one method is applied CALL Interpolate (network = stationsRefElev, & method = interpolationMethod, & near = neighbors, & idw_power = idw_power, & anisotropy = krige_anisotropy, & varmodel = krige_varmodel, & lags = krige_lags, & maxlag = krige_maxlag, & grid = temperatureAirDailyMin, & devst = grid_devst) ELSE !loop trough interpolation methods DO i = 1, 3 IF (interpolationMethod_vector(i) > 0) THEN CALL Interpolate (network = stationsRefElev, & method = interpolationMethod_vector(i), & near = neighbors, & idw_power = idw_power, & anisotropy = krige_anisotropy, & varmodel = krige_varmodel, & lags = krige_lags, & maxlag = krige_maxlag, & grid = interpolatedMap (i), & devst = grid_devst) END IF END DO !compose the final interpolated field DO i = 1, interpolationMethod_map % idim DO j = 1, interpolationMethod_map % jdim IF (interpolationMethod_map % mat(i,j) /= & interpolationMethod_map % nodata ) THEN temperatureAirDailyMin % mat (i,j) = & interpolatedMap (interpolationMethod_map % mat(i,j)) % mat(i,j) END IF END DO END DO END IF !Shift back interpolated field to terrain surface CALL ShiftBackWithLapse (temperatureAirDailyMin, dem, & lapse_map, refElevation) ELSE !elevationdrift = 0 IF (interpolationMethod_assignment == 1) THEN !only one method is applied CALL Interpolate (network = thermometersDailyMin, & method = interpolationMethod, & near = neighbors, & idw_power = idw_power, & anisotropy = krige_anisotropy, & varmodel = krige_varmodel, & lags = krige_lags, & maxlag = krige_maxlag, & grid = temperatureAirDailyMin, & devst = grid_devst) ELSE !loop trough interpolation methods DO i = 1, 3 IF (interpolationMethod_vector(i) > 0) THEN CALL Interpolate (network = thermometersDailyMin, & method = interpolationMethod_vector(i), & near = neighbors, & idw_power = idw_power, & anisotropy = krige_anisotropy, & varmodel = krige_varmodel, & lags = krige_lags, & maxlag = krige_maxlag, & grid = interpolatedMap (i), & devst = grid_devst) END IF END DO !compose the final interpolated field DO i = 1, interpolationMethod_map % idim DO j = 1, interpolationMethod_map % jdim IF (interpolationMethod_map % mat(i,j) /= & interpolationMethod_map % nodata ) THEN temperatureAirDailyMin % mat (i,j) = & interpolatedMap (interpolationMethod_map % mat(i,j)) % mat(i,j) END IF END DO END DO END IF !1 or more interpolation methods END IF !elevationDrift END SELECT !apply scale factor and offset, if defined IF (offset_value /= MISSING_DEF_REAL) THEN CALL Offset (temperatureAirDailyMin, offset_value) END IF IF (scale_factor /= MISSING_DEF_REAL) THEN CALL Scale (temperatureAirDailyMin, scale_factor) END IF !grid exporting IF(export > 0 ) THEN IF( time == timeNewExport .AND. & time >= export_start .AND. & time <= export_stop ) THEN timeString = time timeString = timeString(1:19) timeString(14:14) = '-' timeString(17:17) = '-' grid_devst % reference_time = temperatureAirDailyMin % reference_time IF (needConversion) THEN CALL GridConvert (temperatureAirDailyMin, exportedGrid) CALL GridConvert (grid_devst, exportedGridVar) ELSE exportedGrid = temperatureAirDailyMin exportedGridVar = grid_devst END IF SELECT CASE (export_format) CASE (1) !esri-ascii export_file = TRIM(export_path) // TRIM(timeString) // & '_temperature_daily_min.asc' CALL Catch ('info', 'AirTemperatureDailyMin', & 'exporting grid to file: ', & argument = TRIM(export_file)) CALL ExportGrid (exportedGrid, export_file, ESRI_ASCII) IF (krige_var == 1) THEN !export kriging variance export_file_var = TRIM(export_path) // TRIM(timeString) // & '_temperature_daily_min_variance.asc' CALL Catch ('info', 'AirTemperatureDailyMin', & 'exporting variance grid to file: ', & argument = TRIM(export_file_var)) CALL ExportGrid (exportedGridVar, export_file_var, ESRI_ASCII) END IF CASE (2) !esri-binary export_file = TRIM(export_path) // TRIM(timeString) // & '_temperature_daily_min' CALL Catch ('info', 'AirTemperatureDailyMin', & 'exporting grid to file: ', & argument = TRIM(export_file)) CALL ExportGrid (exportedGrid, export_file, ESRI_BINARY) IF (krige_var == 1) THEN !export kriging variance export_file_var = TRIM(export_path) // TRIM(timeString) // & '_temperature_daily_min_variance' CALL Catch ('info', 'AirTemperatureDailyMin', & 'exporting variance grid to file: ', & argument = TRIM(export_file_var)) CALL ExportGrid (exportedGridVar, export_file_var, ESRI_BINARY) END IF CASE (3) !net_cdf CALL SetCurrentTime (time, exportedGrid) CALL Catch ('info', 'AirTemperatureDailyMin', & 'exporting grid to file: ', & argument = TRIM(export_file)) CALL ExportGrid (exportedGrid, export_file, 'air_temperature', 'append') IF (krige_var == 1) THEN !export kriging variance CALL SetCurrentTime (time, exportedGridVar) CALL Catch ('info', 'AirTemperatureDailyMin', & 'exporting grid to file: ', & argument = TRIM(export_file_var)) CALL ExportGrid (exportedGridVar, export_file_var, 'air_temperature_variance', 'append') END IF END SELECT timeNewExport = timeNewExport + export_dt END IF ENDIF !time forward timeNew = timeNew + dtTemperatureDailyMin END IF RETURN END SUBROUTINE AirTemperatureDailyMinRead